
package com.csscis.ssm.core.generic;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.csscis.ssm.core.feature.orm.mybatis.Page;
import com.csscis.ssm.core.util.JsonUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * GenericService的实现类, 其他的自定义 ServiceImpl, 继承自它,可以获得常用的增删查改操作, 未实现的方法有 子类各自实现
 * <p/>
 * Model : 代表数据库中的表 映射的Java对象类型 PK :代表对象的主键类型
 *
 * @author QingHe
 * @since 2014年6月9日 下午6:14:06
 */
public abstract class GenericServiceImpl<Model, PK> implements
        GenericService<Model, PK> {

    private Logger log = LoggerFactory.getLogger(GenericServiceImpl.class);

    /**
     * 定义成抽象方法,由子类实现,完成dao的注入
     *
     * @return GenericDao实现类
     */
    public abstract GenericDao<Model, PK> getDao();

    /**
     * 插入对象
     *
     * @param model
     *            对象
     */
    public int insert(Model model) {

        return getDao().insertSelective(model);
    }

    @Override
    public int insert(Model model, HttpServletRequest request) {
    
        return getDao().insertSelective(model);
    }

    @Override
    public int insert(
            Model model,
            HttpServletRequest request,
            HttpSession session) {
    
        return getDao().insertSelective(model);
    }

    /**
     * 更新对象
     *
     * @param model
     *            对象
     */
    public int update(Model model) {

        return getDao().updateByPrimaryKeySelective(model);
    }

    /**
     * 通过主键, 删除对象
     *
     * @param id
     *            主键
     */
    public int delete(PK id) {

        return getDao().deleteByPrimaryKey(id);
    }

    /**
     * 通过主键, 查询对象
     *
     * @param id
     *            主键
     * @return
     */
    public Model selectById(PK id) {

        return getDao().selectByPrimaryKey(id);
    }

    @Override
    public List<Model> selectList() {

        return getDao().selectAll(null);
    }

    @Override
    public List<Model> selectAndPage(Page<Model> page, Model model) {

        return getDao().selectAndPage(page, model);
    }

    @Override
    public List<Model> selectByExampleAndPage(
            Page<Model> page,
            GenericExample example) {

        return getDao().selectByExampleAndPage(page, example);
    }

    @Override
    public String selectPageAndJson(Integer pageNo, Integer pageSize, Model model) {

        Page<Model> page = new Page<Model>(pageNo, pageSize);
        getDao().selectAndPage(page, model);
        try {
            return JsonUtils.jsonResult(page.getResult(), page.getTotalCount());
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return "";
            //e.printStackTrace();
        }
    }

    @Override
    public int deleteObject(Model model) {

        return getDao().deleteObject(model);
    }

    @Override
    public List<Model> selectAll(Model model) {

        return getDao().selectAll(model);
    }
}
